package com.demo.stream_.collect;

import com.demo.stream_.Person;
import org.junit.Test;

import java.util.*;
import java.util.stream.Collectors;

/**
 * http://t.csdn.cn/qQN21
 * @author gy
 * @date 2022/5/11
 *
 * collect,收集，可以说是内容最繁多、功能最丰富的部分了。
 * 从字面上理解，就是把一个流收集起来，最终可以是收集成一个值，也可以收集成一个新的集合
 *
 * collect 主要依赖于 java.util.stream.Collectors 类内置的静态方法
 *
 * 因为流不存储数据，那么在流中的数据完成处理后，需要将流中的数据重新归集到新的集合里
 * toList、toSet、toMap 比较常用，另外还有 toCollection、toConcurrentMap等复杂的用法
 */
public class ToListToSetToMap {
    /**
     * toList 返回个集合
     * toSet  返回个去重后的集合
     * toMap  对结果做 key -> value 映射
     */
    @Test
    public void m1(){
        List<Integer> list = Arrays.asList(1, 6, 3, 4, 6, 7, 9, 6, 20);
        List<Integer> listNew = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());
        Set<Integer> set = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toSet());

        List<Person> personList = new ArrayList<Person>();
        personList.add(new Person("Tom", 8900, 23, "male", "New York"));
        personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
        personList.add(new Person("Lily", 7800, 21, "female", "Washington"));
        personList.add(new Person("Anni", 8200, 24, "female", "New York"));

        Map<?, Person> map = personList.stream().filter(p -> p.getSalary() > 8000)
                .collect(Collectors.toMap(Person::getName, p -> p));
        System.out.println("toList:" + listNew);
        System.out.println("toSet:" + set);
        System.out.println("toMap:" + map);
    }

}
